<?php

class ReporteController extends Zend_Controller_Action {

	public function init() {
		$this -> em = Zend_Registry::getInstance() -> entitymanager;
	}

	public function indexAction() {
		X\Permiso::paraAction('Listar.Reporte');
		$facultades = $this -> em -> createQueryBuilder() -> select('f.idFacultad') -> addselect('f.nombre') -> from('Default_Model_Facultad', 'f') -> orderBy('f.nombre', 'asc') -> getQuery() -> execute();

		$this -> view -> facultades = Zend_Json::encode(Array("success" => true, "total" => count($facultades), "rows" => $facultades));

		$carreras = $this -> em -> createQueryBuilder() -> select('c.idCarrera') -> addselect('c.nombre') -> addselect('c.duracionHora') -> from('Default_Model_Carrera', 'c') -> orderBy('c.nombre', 'asc') -> getQuery() -> execute();

		//Agregar al array un elemento para la opcion Todas las carreras
		$add = array('idCarrera' => 0, 'nombre' => 'Todas');
		array_unshift($carreras, $add);

		$this -> view -> carreras = Zend_Json::encode(Array("success" => true, "total" => count($carreras), "rows" => $carreras));

		$user = X\Session::getIdUsuario();

		$profesores = $this -> em -> createQueryBuilder() -> select('p.idProfesor') -> addselect('p.codigoTarjeta') -> addselect('u.nombre') -> addselect('u.apellido') -> from('Default_Model_Profesor', 'p') -> join('p.usuario', 'u')
		// -> where     ("u.idUsuario='".$user."'")
		-> orderBy('u.apellido', 'asc') -> getQuery() -> execute();

		$this -> view -> profesores = Zend_Json::encode(Array("success" => true, "total" => count($profesores), "rows" => $profesores));

	}

	public function generarTodosAction() {
		X\Permiso::paraAction('Generar.Reporte');
		$desde = "01/10/2013";
		$hasta = "24/10/2013";

		$infoProfesor = $this -> em -> createQueryBuilder() -> select('u.idUsuario') -> addselect('p.codigoTarjeta') -> addselect('u.nombre') -> addselect('u.apellido') -> from('Default_Model_Profesor', 'p') -> join('p.usuario', 'u')
		// -> setFirstResult(0)
		//   ->setMaxResults(3)
		-> getQuery() -> execute();
		$i = 0;
		if (count($infoProfesor) > 0) {
			$pdf = new Zend_Pdf();
			foreach ($infoProfesor as $profesor) {
				$nombreProf = $profesor['nombre'];
				$apellidoProf = $profesor['apellido'];

				//crear QueryBuilder
				$qb = $this -> em -> createQueryBuilder();

				$marcaciones = $qb -> select('h.fecha') -> addSelect('h.tipo') -> addSelect('h.entrada_salida') -> from('Default_Model_HorarioDia', 'h') -> where("h.id_empleado='" . $profesor['codigoTarjeta'] . "'") -> andWhere($qb -> expr() -> between('h.fecha', "'" . $desde . "'", "'" . $hasta . "'")) -> getQuery() -> execute();

				$data = array('fecha' => '', 'dia' => '', 'entrada' => '', 'salida' => '');
				$dataSet = array();
				list($date, $month, $year) = explode("/", $desde);
				$fechaAux = $year . "-" . $month . "-" . $date;
				$fechaActual = date('Y-m-d', strtotime($fechaAux) - 86400);
				$marcaEntrada = false;
				$marcaSalida = false;

				foreach ($marcaciones as $marca) {
					//Marcacion en un mismo dia, luego de marcar salida
					if ($marca['fecha'] == $fechaActual) {
						if ($marcaSalida) {
							//Si es salida, se actualiza la hora de salida
							if ($marca['tipo'] == 'SALIDA') {
								$data['salida'] = $marca['entrada_salida'] -> format('H:i:s');
							} else {//Si es entrada, se agrega la marcacion anterior y se inicializa una nueva
								array_push($dataSet, $data);
								$marcaSalida = false;
								unset($data);
								$data = array('fecha' => '', 'dia' => '', 'entrada' => '', 'salida' => '');
								$data['fecha'] = $fechaActual -> format('Y-m-d');
								$data['dia'] = date('N', strtotime($marca['fecha']));
								$data['entrada'] = $marca['entrada_salida'] -> format('H:i:s');
								$marcaEntrada = true;
							}
						} elseif ($marca['tipo'] == 'ENTRADA' && !$marcaEntrada) {
							$marcaSalida = false;
							unset($data);
							$data = array('fecha' => '', 'dia' => '', 'entrada' => '', 'salida' => '');
							$data['fecha'] = $fechaActual -> format('Y-m-d');
							$data['dia'] = date('N', strtotime($marca['fecha']));
							$data['entrada'] = $marca['entrada_salida'] -> format('H:i:s');
							$marcaEntrada = true;
						}

					}
					//Nuevo dia
					if ($marca['fecha'] != $fechaActual) {
						//La salida del dia anterior fue la ultima, se agrega la marcacion
						if ($marcaEntrada && $marcaSalida) {
							array_push($dataSet, $data);
							$marcaSalida = false;
						}
						$marcaEntrada = false;
						$fechaActual = $marca['fecha'];
						if ($marca['tipo'] == 'ENTRADA') {
							unset($data);
							$data = array('fecha' => '', 'dia' => '', 'entrada' => '', 'salida' => '');
							$data['fecha'] = $fechaActual -> format('Y-m-d');
							$data['dia'] = date('N', strtotime($marca['fecha']));
							$data['entrada'] = $marca['entrada_salida'] -> format('H:i:s');
							$marcaEntrada = true;
						}
					}
					//Marcacion de salida, puede no ser la ultima
					if ($marca['fecha'] == $fechaActual && $marca['tipo'] == 'SALIDA' && $marcaEntrada) {
						$data['salida'] = $marca['entrada_salida'] -> format('H:i:s');
						$marcaSalida = true;
					}
				}
				//Se agrega la ultima marcacion correcta
				if ($marcaEntrada && $marcaSalida) {
					array_push($dataSet, $data);
				}

				//Traer cursos validos del profesor, durante el periodo especificado
				$qb = $this -> em -> createQueryBuilder();

				$cursos = $qb -> select('c.idCurso') -> addSelect('c.validoDesde') -> addSelect('c.validoHasta') -> addSelect('c.seccion') -> addSelect('p.idProfesor') -> addSelect('d.dia') -> addSelect('d.horaInicio') -> addSelect('d.horaFin') -> addSelect('d.duracionHoras') -> addSelect('m.idMateria') -> addSelect('m.nombre') -> addSelect('ca.duracionHora') -> addSelect('ca.nombre as carrera') -> from('Default_Model_Curso', 'c') -> join('c.carreraMateria', 'cm') -> join('c.responsables', 'r') -> join('c.detalles', 'd') -> join('r.profesor', 'p') -> join('cm.materia', 'm') -> join('cm.carrera', 'ca') -> andWhere("p.codigoTarjeta='" . $profesor['codigoTarjeta'] . "'") -> andWhere('r.marca= true') -> andWhere("c.validoDesde<='" . $desde . "' AND c.validoHasta>='" . $desde . "' OR
                                       c.validoDesde<='" . $hasta . "' AND c.validoHasta>='" . $hasta . "'") -> orderBy('m.nombre', 'asc') -> orderBy('c.seccion', 'asc') -> orderBy('c.validoDesde', 'asc') -> orderBy('d.dia', 'asc') -> getQuery() -> execute();

				// si el profesor no tiene cursos activos no se considera
				if (count($cursos) > 0) {
					//   echo $i++;

					// Luego para cada curso ajustar la validez segun el rango seleccionado
					list($date, $month, $year) = explode("/", $desde);
					$cotaDesde = $year . "-" . $month . "-" . $date;
					list($date, $month, $year) = explode("/", $hasta);
					$cotaHasta = $year . "-" . $month . "-" . $date;

					foreach ($cursos as &$curso) {
						if ($curso['validoDesde'] -> format('Y-m-d') < $cotaDesde) {
							$curso['validoDesde'] = $cotaDesde;
						} else {
							$curso['validoDesde'] = $curso['validoDesde'] -> format('Y-m-d');
						}
						if ($curso['validoHasta'] -> format('Y-m-d') > $cotaHasta) {
							$curso['validoHasta'] = $cotaHasta;
						} else {
							$curso['validoHasta'] = $curso['validoHasta'] -> format('Y-m-d');
						}
						$curso['horaInicio'] = $curso['horaInicio'] -> format('H:i:s');
						$curso['horaFin'] = $curso['horaFin'] -> format('H:i:s');
						//var_dump($curso);
					}
					unset($curso);

					/*echo "\n";
					 var_dump($cursos);
					 echo "\n";
					 var_dump($dataSet);
					 echo "\n";
					 */

					$reportes = array();

					foreach ($cursos as $curso) {
						$fechaActual = $cotaDesde;
						$marcacion = reset($dataSet);
						while ($fechaActual <= $cotaHasta) {
							$pushRegister = false;
							if ($fechaActual >= $curso['validoDesde'] && $fechaActual <= $curso['validoHasta']) {
								$dia = date('N', strtotime($fechaActual));
								$debeMarcar = false;
								if ($dia == $curso['dia']) {
									$debeMarcar = true;
									$asistio = false;
									$registro = array('materia' => '', 'fecha' => '', 'inicio' => '', 'fin' => '', 'entrada' => '', 'salida' => '', 'tiene' => '', 'hizo' => '');
									if ($fechaActual == $marcacion['fecha']) {
										// (+/-) 10 minutes, para indicar los minutos de tolerancia
										$inicioTolerable = date("H:i:s", strtotime("+10 minutes", strtotime($curso['horaInicio'])));
										$finTolerable = date("H:i:s", strtotime("-10 minutes", strtotime($curso['horaFin'])));
										while ($fechaActual == $marcacion['fecha']) {
											if (!$asistio) {
												if ($inicioTolerable >= $marcacion['entrada'] && $finTolerable <= $marcacion['salida']) {
													//echo ' MARCO '.$fechaActual.' '.$curso['horaInicio'];
													//echo ' '.$curso['horaFin'].' '.$curso['duracionHoras']."\n";
													$registro['materia'] = $curso['nombre'];
													//    $registro['carrera'] = $curso['carrera'];
													$registro['seccion'] = $curso['seccion'];
													$registro['fecha'] = $fechaActual;
													$registro['inicio'] = $curso['horaInicio'];
													$registro['fin'] = $curso['horaFin'];
													$registro['entrada'] = $curso['horaInicio'];
													$registro['salida'] = $curso['horaFin'];
													$registro['tiene'] = $curso['duracionHoras'];
													$registro['hizo'] = $curso['duracionHoras'];
													$pushRegister = true;
													$asistio = true;
												} else {
													$horaEntrada = date("H:i:s", strtotime("00:00:00"));
													$horaSalida = date("H:i:s", strtotime("00:00:00"));
													$entradaValida = false;
													$salidaValida = false;
													if ($marcacion['entrada'] >= $curso['horaInicio'] && $marcacion['entrada'] < $curso['horaFin']) {
														$horaEntrada = $marcacion['entrada'];
														$entradaValida = true;
													} elseif (($marcacion['entrada'] <= $curso['horaInicio']) && ($marcacion['salida'] > $curso['horaInicio'])) {
														$horaEntrada = $curso['horaInicio'];
														$entradaValida = true;
													}

													if ($marcacion['salida'] > $curso['horaInicio'] && $marcacion['salida'] <= $curso['horaFin']) {
														$horaSalida = $marcacion['salida'];
														$salidaValida = true;
													} elseif (($marcacion['salida'] >= $curso['horaFin']) && ($marcacion['entrada'] < $curso['horaFin'])) {
														$horaSalida = $curso['horaFin'];
														$salidaValida = true;
													}

													if ($entradaValida && $salidaValida) {
														$horas = round((((strtotime($horaSalida) - strtotime($horaEntrada)) / 60) / $curso['duracionHora']) * 10) / 10;
														$registro['materia'] = $curso['nombre'];
														//      $registro['carrera'] = $curso['carrera'];
														$registro['seccion'] = $curso['seccion'];
														$registro['fecha'] = $fechaActual;
														$registro['inicio'] = $curso['horaInicio'];
														$registro['fin'] = $curso['horaFin'];
														$registro['entrada'] = $horaEntrada;
														$registro['salida'] = $horaSalida;
														$registro['tiene'] = $curso['duracionHoras'];
														$registro['hizo'] = $horas;
														$pushRegister = true;
														$asistio = true;
													}
												}
											}
											$marcacion = next($dataSet);
										}
										$marcacion = prev($dataSet);
										if (!$asistio) {
											$registro['materia'] = $curso['nombre'];
											//        $registro['carrera'] = $curso['carrera'];
											$registro['seccion'] = $curso['seccion'];
											$registro['fecha'] = $fechaActual;
											$registro['inicio'] = $curso['horaInicio'];
											$registro['fin'] = $curso['horaFin'];
											$registro['entrada'] = $horaEntrada;
											$registro['salida'] = $horaSalida;
											$registro['tiene'] = $curso['duracionHoras'];
											$registro['hizo'] = 0;
											$pushRegister = true;
										}
									}
									if ($debeMarcar && !$asistio) {
										$registro['materia'] = $curso['nombre'];
										//      $registro['carrera'] = $curso['carrera'];
										$registro['seccion'] = $curso['seccion'];
										$registro['fecha'] = $fechaActual;
										$registro['inicio'] = $curso['horaInicio'];
										$registro['fin'] = $curso['horaFin'];
										$registro['entrada'] = "00:00:00";
										$registro['salida'] = "00:00:00";
										$registro['tiene'] = $curso['duracionHoras'];
										$registro['hizo'] = 0;
										$pushRegister = true;
									}
									if ($pushRegister) {
										array_push($reportes, $registro);
									}
									unset($registro);
								}
							}
							$fechaActual = date("Y-m-d", strtotime("+1 day", strtotime($fechaActual)));
							if ($fechaActual > $marcacion['fecha']) {
								$marcacion = next($dataSet);
								$fechaAyer = date("Y-m-d", strtotime("-1 day", strtotime($fechaActual)));
								if ($fechaAyer == $marcacion['fecha']) {
									$fechaActual = $fechaAyer;
								}
							}
						}
					}

					/*echo "MARCACIONES\n";
					 foreach ($dataSet as $row){
					 echo $row['fecha'].' '.$row['dia'].' '.$row['entrada'].' '.$row['salida']."\n";
					 }
					 unset($row);
					 /*echo "CURSOS\n";
					 foreach ($cursos as $row){
					 echo $row['dia'].' '.$row['horaInicio'].' '.$row['horaFin'].' '.$row['duracionHoras']."\n";
					 }
					 unset($row);*/

					//Ordenar $reportes por materia y fecha
					foreach ($reportes as $key => $row) {
						$reporteMateria[$key] = $row['materia'];
						//  $reporteCarrera[$key] = $row['carrera'];
						// $reporteSeccion[$key] = $row['seccion'];
						$reporteFecha[$key] = $row['fecha'];
					}

					array_multisort($reporteMateria, SORT_ASC, $reporteFecha, SORT_ASC, $reportes);

					//Eliminar registros repetidos. Se da para el caso de catedras compartidas
					$reportes = array_map("unserialize", array_unique(array_map("serialize", $reportes)));

					$nombreProfesor = $apellidoProf . ', ' . $nombreProf;
					//$desde = date('d/m/Y', strtotime($desde));
					//$hasta = date('d/m/Y', strtotime($hasta));
					$materia = $reportes[0]['materia'];
					$carrera = $reportes[0]['carrera'];
					$seccion = $reportes[0]['seccion'];

					//Generar reporte
					//Crear PDF

					//Crear pagina
					$page = new Zend_Pdf_Page(Zend_Pdf_Page::SIZE_A4);
					//':595:842'
					//Definir fuentes
					$font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA);
					$font2 = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA_BOLD);

					$page -> setFont($font2, 10) -> drawText('REPORTE DE ASISTENCIA DE PROFESORES', 40, 800) -> drawText('Docente', 40, 785) -> drawText('Desde', 40, 770) -> drawText('Hasta', 40, 755) -> drawText(':', 83, 785) -> drawText(':', 83, 770) -> drawText(':', 83, 755);

					$page -> setFont($font, 10) -> drawText("$nombreProfesor", 90, 785, 'UTF-8') -> drawText("$desde", 90, 770) -> drawText("$hasta", 90, 755);

					/*$image = \Zend_Pdf_Image::imageWithPath('img/logoUCA.png');
					 $page->drawImage($image, 20, 740, ($image->getPixelWidth()+20), (740+$image->getPixelHeight()));*/
					$page -> setLineColor(new \Zend_Pdf_Color_Rgb(0, 0, 0)) -> drawLine(40, 745, ($page -> getWidth() - 40), 745) -> drawLine(40, 725, ($page -> getWidth() - 40), 725) -> drawLine(40, 712, ($page -> getWidth() - 40), 712);

					$page -> setFont($font2, 10) -> drawText(strtoupper($materia) . " - Sección " . $seccion, 40, 730, 'UTF-8');

					$page -> setFont($font, 10) -> drawText('Fecha', 40, 715) -> drawText('Inicio', 110, 715) -> drawText('Fin', 170, 715) -> drawText('Entrada', 230, 715) -> drawText('Salida', 290, 715)
					// -> drawText('Horas cátedra', 350, 715, 'UTF-8');
					-> drawText('Horas programadas', 350, 715) -> drawText('Horas cumplidas', 455, 715);

					//Agregar pagina al pdf
					$pdf -> pages[] = $page;

					$currentPage = 1;
					$yPoint = 700;
					$totalCumplidas = 0;
					$totalProgramadas = 0;
					$obs = false;

					foreach ($reportes as $reporte) {
						if (strcmp($materia, $reporte['materia']) != 0 || strcmp($seccion, $reporte['seccion']) != 0) {
							$materia = $reporte['materia'];
							$seccion = $reporte['seccion'];
							$carrera = $reporte['carrera'];

							$page -> setLineColor(new \Zend_Pdf_Color_Rgb(0, 0, 0)) -> drawLine(40, $yPoint + 5, ($page -> getWidth() - 40), $yPoint + 5) -> drawLine(40, $yPoint - 8, ($page -> getWidth() - 40), $yPoint - 8);

							$page -> setFont($font2, 10) -> drawText('TOTAL DE HORAS CATEDRA : ', 40, $yPoint - 5) -> drawText($totalProgramadas, 350, $yPoint - 5) -> drawText($totalCumplidas, 455, $yPoint - 5);
							$yPoint = $yPoint - 20;
							$totalCumplidas = 0;
							$totalProgramadas = 0;

							if ($yPoint < 120) {
								$yPoint = 89;
							} else {
								$yPoint = $yPoint - 5;
								$page -> setFont($font2, 10) -> drawText(strtoupper($materia) . " - Sección " . $seccion, 40, $yPoint, 'UTF-8');

								$page -> setLineColor(new \Zend_Pdf_Color_Rgb(0, 0, 0)) -> drawLine(40, $yPoint - 5, ($page -> getWidth() - 40), $yPoint - 5) -> drawLine(40, $yPoint - 18, ($page -> getWidth() - 40), $yPoint - 18);

								$page -> setFont($font, 10) -> drawText('Fecha', 40, $yPoint - 15) -> drawText('Inicio', 110, $yPoint - 15) -> drawText('Fin', 170, $yPoint - 15) -> drawText('Entrada', 230, $yPoint - 15) -> drawText('Salida', 290, $yPoint - 15) -> drawText('Horas programadas', 350, $yPoint - 15) -> drawText('Horas cumplidas', 455, $yPoint - 15);

								$yPoint = $yPoint - 30;
							}
						}
						//Salto de pagina, agregar tambien || (($materia!=$reporte['materia'])&& $yPoint)?
						if ($yPoint < 90) {
							//Nueva pagina
							$page = new Zend_Pdf_Page(Zend_Pdf_Page::SIZE_A4);
							//'595:842:'
							//Agregar pagina al pdf
							$pdf -> pages[] = $page;
							$yPoint = 800;
							$currentPage++;
						}
						//Encabezado para cualquier pagina que no sea la primera
						if ($currentPage > 1 && $yPoint == 800) {

							$page -> setLineColor(new \Zend_Pdf_Color_Rgb(0, 0, 0)) -> drawLine(40, 795, ($page -> getWidth() - 40), 795) -> drawLine(40, 782, ($page -> getWidth() - 40), 782);

							$page -> setFont($font2, 10) -> drawText(strtoupper($materia), 40, 800, 'UTF-8');

							$page -> setFont($font, 10) -> drawText('Fecha', 40, 785) -> drawText('Inicio', 110, 785) -> drawText('Fin', 170, 785) -> drawText('Entrada', 230, 785) -> drawText('Salida', 290, 785)
							// -> drawText('Horas cátedra', 350, 785, 'UTF-8');
							-> drawText('Horas programadas', 350, 785) -> drawText('Horas cumplidas', 455, 785);

							$yPoint = 770;
						}
						if ($reporte['tiene'] > $reporte['hizo']) {
							$obs = true;
							$dFont = $font2;
						} else {
							$dFont = $font;
						}
						$fecha = date('d/m/Y', strtotime($reporte['fecha']));
						$page -> setFont($dFont, 10) -> drawText($fecha, 40, $yPoint) -> drawText($reporte['inicio'], 110, $yPoint) -> drawText($reporte['fin'], 170, $yPoint) -> drawText($reporte['entrada'], 230, $yPoint) -> drawText($reporte['salida'], 290, $yPoint) -> drawText($reporte['tiene'], 350, $yPoint) -> drawText($reporte['hizo'], 455, $yPoint);

						$yPoint = $yPoint - 15;
						$totalCumplidas = $totalCumplidas + $reporte['hizo'];
						$totalProgramadas = $totalProgramadas + $reporte['tiene'];
					}

					$page -> setLineColor(new \Zend_Pdf_Color_Rgb(0, 0, 0)) -> drawLine(40, $yPoint + 5, ($page -> getWidth() - 40), $yPoint + 5) -> drawLine(40, $yPoint - 8, ($page -> getWidth() - 40), $yPoint - 8);

					$page -> setFont($font2, 10) -> drawText('TOTAL DE HORAS CATEDRA : ', 40, $yPoint - 5) -> drawText($totalProgramadas, 350, $yPoint - 5) -> drawText($totalCumplidas, 455, $yPoint - 5);

					$yPoint = $yPoint - 20;
					if ($yPoint < 90) {
						//Nueva pagina
						$page = new Zend_Pdf_Page(Zend_Pdf_Page::SIZE_A4);
						//'595:842:'
						//Agregar pagina al pdf
						$pdf -> pages[] = $page;
						$yPoint = 800;
						$currentPage++;
					}

					if ($obs) {
						$mensaje = "ATENCION: Existe una diferencia con respecto a la cantidad de horas programadas. Las razones podrían ser:";
						$mensaje_opcion01 = "- Cátedra compartida.";
						$mensaje_opcion02 = "- Asuestos/feriados.";
						//$mensaje1 = "Tenga en cuenta que proximamente se liquidará conforme el resultado de este reporte. ";
						$mensaje2 = "Si el reporte le parece incorrecto, por favor solicite un reporte de marcaciones.-";
						
			
						$page -> setFont($font2, 10) -> drawText($mensaje, 40, $yPoint - 5, 'UTF-8') 
							-> drawText($mensaje_opcion01, 40, $yPoint - 18, 'UTF-8') 
							-> drawText($mensaje_opcion02, 40, $yPoint - 28, 'UTF-8')
							//-> drawText($mensaje1, 40, $yPoint - 40, 'UTF-8') 
							-> drawText($mensaje2, 40, $yPoint - 50, 'UTF-8');
					}
				}

			}

			$page -> setFont($font, 10);

			//Numerar paginas
			$pageNumber = 1;
			foreach ($pdf->pages as $p) {
				$p -> drawText($pageNumber++, 550, 40);
			}

			// Guardar el pdf
			//$fileName = 'ReporteAsistencia'.$profesor.'.pdf';
			$fileName = 'ReportesAsistenciaCompleto.pdf';
			$save = $pdf -> save($fileName);

			// if($save){
			// X\Msg::Success('El reporte se ha generado con éxito.');
			header('Content-Type:', 'application/pdf');
			header('Content-Disposition:', 'inline;');

			// Output pdf
			echo $pdf -> render();
			// }

			// else
			//    X\Msg::Failure('Error al generar el archivo.');
		}
	}

	public function ajaxGenerarAction() {
		X\Permiso::paraAction('Generar.Reporte');
		$profesor = $this -> _request -> getPost('profesor');
		$semestre = $this -> _request -> getPost('semestre');
		$carrera = $this -> _request -> getPost('carrera');
		$desde = $this -> _request -> getPost('desde');
		$hasta = $this -> _request -> getPost('hasta');

		if ($semestre == '-')
			$whereSemestre = "1=1";
		else
			$whereSemestre = "cm.semestre='" . $semestre . "'";

		if ($carrera == 0)
			$whereCarrera = "1=1";
		else
			$whereCarrera = "cm.carrera='" . $carrera . "'";

		$infoProfesor = $this -> em -> createQueryBuilder() -> select('u.nombre') -> addselect('u.apellido') -> from('Default_Model_Profesor', 'p') -> join('p.usuario', 'u') -> where("p.codigoTarjeta='" . $profesor . "'") -> getQuery() -> execute();

		$nombreProf = $infoProfesor[0]['nombre'];
		$apellidoProf = $infoProfesor[0]['apellido'];

		//crear QueryBuilder
		$qb = $this -> em -> createQueryBuilder();

		$marcaciones = $qb -> select('h.fecha') -> addSelect('h.tipo') -> addSelect('h.entrada_salida') -> from('Default_Model_HorarioDia', 'h') -> where("h.id_empleado='" . $profesor . "'") -> andWhere($qb -> expr() -> between('h.fecha', "'" . $desde . "'", "'" . $hasta . "'")) -> getQuery() -> execute();

		$data = array('fecha' => '', 'dia' => '', 'entrada' => '', 'salida' => '');
		$dataSet = array();
		list($date, $month, $year) = explode("/", $desde);
		$fechaAux = $year . "-" . $month . "-" . $date;
		$fechaActual = date('Y-m-d', strtotime($fechaAux) - 86400);
		$marcaEntrada = false;
		$marcaSalida = false;

		foreach ($marcaciones as $marca) {
			//Marcacion en un mismo dia, luego de marcar salida
			if ($marca['fecha'] == $fechaActual) {
				if ($marcaSalida) {
					//Si es salida, se actualiza la hora de salida
					if ($marca['tipo'] == 'SALIDA') {
						$data['salida'] = $marca['entrada_salida'] -> format('H:i:s');
					} else {//Si es entrada, se agrega la marcacion anterior y se inicializa una nueva
						array_push($dataSet, $data);
						$marcaSalida = false;
						unset($data);
						$data = array('fecha' => '', 'dia' => '', 'entrada' => '', 'salida' => '');
						$data['fecha'] = $fechaActual -> format('Y-m-d');
						$data['dia'] = date('N', strtotime($marca['fecha']));
						$data['entrada'] = $marca['entrada_salida'] -> format('H:i:s');
						$marcaEntrada = true;
					}
				} elseif ($marca['tipo'] == 'ENTRADA' && !$marcaEntrada) {
					$marcaSalida = false;
					unset($data);
					$data = array('fecha' => '', 'dia' => '', 'entrada' => '', 'salida' => '');
					$data['fecha'] = $fechaActual -> format('Y-m-d');
					$data['dia'] = date('N', strtotime($marca['fecha']));
					$data['entrada'] = $marca['entrada_salida'] -> format('H:i:s');
					$marcaEntrada = true;
				}

			}
			//Nuevo dia
			if ($marca['fecha'] != $fechaActual) {
				//La salida del dia anterior fue la ultima, se agrega la marcacion
				if ($marcaEntrada && $marcaSalida) {
					array_push($dataSet, $data);
					$marcaSalida = false;
				}
				$marcaEntrada = false;
				$fechaActual = $marca['fecha'];
				if ($marca['tipo'] == 'ENTRADA') {
					unset($data);
					$data = array('fecha' => '', 'dia' => '', 'entrada' => '', 'salida' => '');
					$data['fecha'] = $fechaActual -> format('Y-m-d');
					$data['dia'] = date('N', strtotime($marca['fecha']));
					$data['entrada'] = $marca['entrada_salida'] -> format('H:i:s');
					$marcaEntrada = true;
				}
			}
			//Marcacion de salida, puede no ser la ultima
			if ($marca['fecha'] == $fechaActual && $marca['tipo'] == 'SALIDA' && $marcaEntrada) {
				$data['salida'] = $marca['entrada_salida'] -> format('H:i:s');
				$marcaSalida = true;
			}
		}
		//Se agrega la ultima marcacion correcta
		if ($marcaEntrada && $marcaSalida) {
			array_push($dataSet, $data);
		}

		//Traer cursos validos del profesor, durante el periodo especificado
		$qb = $this -> em -> createQueryBuilder();

		$cursos = $qb -> select('c.idCurso') -> addSelect('c.validoDesde') -> addSelect('c.validoHasta') -> addSelect('p.idProfesor') -> addSelect('d.dia') -> addSelect('d.horaInicio') -> addSelect('d.horaFin') -> addSelect('d.duracionHoras') -> addSelect('m.idMateria') -> addSelect('m.nombre') -> addSelect('ca.duracionHora') -> from('Default_Model_Curso', 'c') -> join('c.carreraMateria', 'cm') -> join('c.responsables', 'r') -> join('c.detalles', 'd') -> join('r.profesor', 'p') -> join('cm.materia', 'm') -> join('cm.carrera', 'ca') -> where($whereCarrera) -> andWhere($whereSemestre) -> andWhere("p.codigoTarjeta='" . $profesor . "'") -> andWhere('r.marca= true') -> andWhere("c.validoDesde<='" . $desde . "' AND c.validoHasta>='" . $desde . "' OR
                                   c.validoDesde<='" . $hasta . "' AND c.validoHasta>='" . $hasta . "'") -> orderBy('m.nombre', 'asc') -> orderBy('c.validoDesde', 'asc') -> orderBy('d.dia', 'asc') -> getQuery() -> execute();

		// Luego para cada curso ajustar la validez segun el rango seleccionado
		list($date, $month, $year) = explode("/", $desde);
		$cotaDesde = $year . "-" . $month . "-" . $date;
		list($date, $month, $year) = explode("/", $hasta);
		$cotaHasta = $year . "-" . $month . "-" . $date;

		foreach ($cursos as &$curso) {
			if ($curso['validoDesde'] -> format('Y-m-d') < $cotaDesde) {
				$curso['validoDesde'] = $cotaDesde;
			} else {
				$curso['validoDesde'] = $curso['validoDesde'] -> format('Y-m-d');
			}
			if ($curso['validoHasta'] -> format('Y-m-d') > $cotaHasta) {
				$curso['validoHasta'] = $cotaHasta;
			} else {
				$curso['validoHasta'] = $curso['validoHasta'] -> format('Y-m-d');
			}
			$curso['horaInicio'] = $curso['horaInicio'] -> format('H:i:s');
			$curso['horaFin'] = $curso['horaFin'] -> format('H:i:s');
			//var_dump($curso);
		}
		unset($curso);

		/*echo "\n";
		 var_dump($cursos);
		 echo "\n";
		 var_dump($dataSet);
		 echo "\n";
		 */

		$reportes = array();
		foreach ($cursos as $curso) {
			$fechaActual = $cotaDesde;
			$marcacion = reset($dataSet);
			while ($fechaActual <= $cotaHasta) {
				$pushRegister = false;
				if ($fechaActual >= $curso['validoDesde'] && $fechaActual <= $curso['validoHasta']) {
					$dia = date('N', strtotime($fechaActual));
					$debeMarcar = false;
					if ($dia == $curso['dia']) {
						$debeMarcar = true;
						$asistio = false;
						$registro = array('materia' => '', 'fecha' => '', 'inicio' => '', 'fin' => '', 'entrada' => '', 'salida' => '', 'tiene' => '', 'hizo' => '');
						if ($fechaActual == $marcacion['fecha']) {
							// (+/-) 10 minutes, para indicar los minutos de tolerancia
							$inicioTolerable = date("H:i:s", strtotime("+10 minutes", strtotime($curso['horaInicio'])));
							$finTolerable = date("H:i:s", strtotime("-10 minutes", strtotime($curso['horaFin'])));
							while ($fechaActual == $marcacion['fecha']) {
								if (!$asistio) {
									if ($inicioTolerable >= $marcacion['entrada'] && $finTolerable <= $marcacion['salida']) {
										//echo ' MARCO '.$fechaActual.' '.$curso['horaInicio'];
										//echo ' '.$curso['horaFin'].' '.$curso['duracionHoras']."\n";
										$registro['materia'] = $curso['nombre'];
										$registro['fecha'] = $fechaActual;
										$registro['inicio'] = $curso['horaInicio'];
										$registro['fin'] = $curso['horaFin'];
										$registro['entrada'] = $curso['horaInicio'];
										$registro['salida'] = $curso['horaFin'];
										$registro['tiene'] = $curso['duracionHoras'];
										$registro['hizo'] = $curso['duracionHoras'];
										$pushRegister = true;
										$asistio = true;
									} else {
										$horaEntrada = date("H:i:s", strtotime("00:00:00"));
										$horaSalida = date("H:i:s", strtotime("00:00:00"));
										$entradaValida = false;
										$salidaValida = false;
										if ($marcacion['entrada'] >= $curso['horaInicio'] && $marcacion['entrada'] < $curso['horaFin']) {
											$horaEntrada = $marcacion['entrada'];
											$entradaValida = true;
										} elseif (($marcacion['entrada'] <= $curso['horaInicio']) && ($marcacion['salida'] > $curso['horaInicio'])) {
											$horaEntrada = $curso['horaInicio'];
											$entradaValida = true;
										}

										if ($marcacion['salida'] > $curso['horaInicio'] && $marcacion['salida'] <= $curso['horaFin']) {
											$horaSalida = $marcacion['salida'];
											$salidaValida = true;
										} elseif (($marcacion['salida'] >= $curso['horaFin']) && ($marcacion['entrada'] < $curso['horaFin'])) {
											$horaSalida = $curso['horaFin'];
											$salidaValida = true;
										}

										if ($entradaValida && $salidaValida) {
											$horas = round((((strtotime($horaSalida) - strtotime($horaEntrada)) / 60) / $curso['duracionHora']) * 10) / 10;
											$registro['materia'] = $curso['nombre'];
											$registro['fecha'] = $fechaActual;
											$registro['inicio'] = $curso['horaInicio'];
											$registro['fin'] = $curso['horaFin'];
											$registro['entrada'] = $horaEntrada;
											$registro['salida'] = $horaSalida;
											$registro['tiene'] = $curso['duracionHoras'];
											$registro['hizo'] = $horas;
											$pushRegister = true;
											$asistio = true;
										}
									}
								}
								$marcacion = next($dataSet);
							}
							$marcacion = prev($dataSet);
							if (!$asistio) {
								$registro['materia'] = $curso['nombre'];
								$registro['fecha'] = $fechaActual;
								$registro['inicio'] = $curso['horaInicio'];
								$registro['fin'] = $curso['horaFin'];
								$registro['entrada'] = $horaEntrada;
								$registro['salida'] = $horaSalida;
								$registro['tiene'] = $curso['duracionHoras'];
								$registro['hizo'] = 0;
								$pushRegister = true;
							}
						}
						if ($debeMarcar && !$asistio) {
							$registro['materia'] = $curso['nombre'];
							$registro['fecha'] = $fechaActual;
							$registro['inicio'] = $curso['horaInicio'];
							$registro['fin'] = $curso['horaFin'];
							$registro['entrada'] = "00:00:00";
							$registro['salida'] = "00:00:00";
							$registro['tiene'] = $curso['duracionHoras'];
							$registro['hizo'] = 0;
							$pushRegister = true;
						}
						if ($pushRegister) {
							array_push($reportes, $registro);
						}
						unset($registro);
					}
				}
				$fechaActual = date("Y-m-d", strtotime("+1 day", strtotime($fechaActual)));
				if ($fechaActual > $marcacion['fecha']) {
					$marcacion = next($dataSet);
					$fechaAyer = date("Y-m-d", strtotime("-1 day", strtotime($fechaActual)));
					if ($fechaAyer == $marcacion['fecha']) {
						$fechaActual = $fechaAyer;
					}
				}
			}
		}

		/*echo "MARCACIONES\n";
		 foreach ($dataSet as $row){
		 echo $row['fecha'].' '.$row['dia'].' '.$row['entrada'].' '.$row['salida']."\n";
		 }
		 unset($row);
		 /*echo "CURSOS\n";
		 foreach ($cursos as $row){
		 echo $row['dia'].' '.$row['horaInicio'].' '.$row['horaFin'].' '.$row['duracionHoras']."\n";
		 }
		 unset($row);*/

		//Ordenar $reportes por materia y fecha
		foreach ($reportes as $key => $row) {
			$reporteMateria[$key] = $row['materia'];
			$reporteFecha[$key] = $row['fecha'];
			$reporteFecha[$key] = $row['fecha'];
		}
		array_multisort($reporteMateria, SORT_ASC, $reporteFecha, SORT_ASC, $reportes);

		//Eliminar registros repetidos. Se da para el caso de catedras compartidas
		$reportes = array_map("unserialize", array_unique(array_map("serialize", $reportes)));

		$nombreProfesor = $apellidoProf . ', ' . $nombreProf;
		//$desde = date('d/m/Y', strtotime($desde));
		//$hasta = date('d/m/Y', strtotime($hasta));
		$materia = $reportes[0]['materia'];

		//Generar reporte
		//Crear PDF
		$pdf = new Zend_Pdf();
		//Crear pagina
		$page = new Zend_Pdf_Page(Zend_Pdf_Page::SIZE_A4);
		//':595:842'
		//Definir fuentes
		$font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA);
		$font2 = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA_BOLD);

		$page -> setFont($font2, 10) -> drawText('REPORTE DE ASISTENCIA DE PROFESORES', 40, 800) -> drawText('Docente', 40, 785) -> drawText('Desde', 40, 770) -> drawText('Hasta', 40, 755) -> drawText(':', 83, 785) -> drawText(':', 83, 770) -> drawText(':', 83, 755);

		$page -> setFont($font, 10) -> drawText("$nombreProfesor", 90, 785, 'UTF-8') -> drawText("$desde", 90, 770) -> drawText("$hasta", 90, 755);

		/*$image = \Zend_Pdf_Image::imageWithPath('img/logoUCA.png');
		 $page->drawImage($image, 20, 740, ($image->getPixelWidth()+20), (740+$image->getPixelHeight()));*/
		$page -> setLineColor(new \Zend_Pdf_Color_Rgb(0, 0, 0)) -> drawLine(40, 745, ($page -> getWidth() - 40), 745) -> drawLine(40, 725, ($page -> getWidth() - 40), 725) -> drawLine(40, 712, ($page -> getWidth() - 40), 712);

		$page -> setFont($font2, 10) -> drawText(strtoupper($materia), 40, 730, 'UTF-8');

		$page -> setFont($font, 10) -> drawText('Fecha', 40, 715) -> drawText('Inicio', 110, 715) -> drawText('Fin', 170, 715) -> drawText('Entrada', 230, 715) -> drawText('Salida', 290, 715)
		// -> drawText('Horas cátedra', 350, 715, 'UTF-8');
		-> drawText('Horas programadas', 350, 715) -> drawText('Horas cumplidas', 455, 715);

		//Agregar pagina al pdf
		$pdf -> pages[] = $page;

		$currentPage = 1;
		$yPoint = 700;
		$totalCumplidas = 0;
		$totalProgramadas = 0;
		$obs = false;

		foreach ($reportes as $reporte) {
			if (strcmp($materia, $reporte['materia']) != 0) {
				$materia = $reporte['materia'];

				$page -> setLineColor(new \Zend_Pdf_Color_Rgb(0, 0, 0)) -> drawLine(40, $yPoint + 5, ($page -> getWidth() - 40), $yPoint + 5) -> drawLine(40, $yPoint - 8, ($page -> getWidth() - 40), $yPoint - 8);

				$page -> setFont($font2, 10) -> drawText('TOTAL DE HORAS CATEDRA : ', 40, $yPoint - 5) -> drawText($totalProgramadas, 350, $yPoint - 5) -> drawText($totalCumplidas, 455, $yPoint - 5);
				$yPoint = $yPoint - 20;
				$totalCumplidas = 0;
				$totalProgramadas = 0;

				if ($yPoint < 120) {
					$yPoint = 89;
				} else {
					$yPoint = $yPoint - 5;
					$page -> setFont($font2, 10) -> drawText(strtoupper($materia), 40, $yPoint, 'UTF-8');

					$page -> setLineColor(new \Zend_Pdf_Color_Rgb(0, 0, 0)) -> drawLine(40, $yPoint - 5, ($page -> getWidth() - 40), $yPoint - 5) -> drawLine(40, $yPoint - 18, ($page -> getWidth() - 40), $yPoint - 18);

					$page -> setFont($font, 10) -> drawText('Fecha', 40, $yPoint - 15) -> drawText('Inicio', 110, $yPoint - 15) -> drawText('Fin', 170, $yPoint - 15) -> drawText('Entrada', 230, $yPoint - 15) -> drawText('Salida', 290, $yPoint - 15) -> drawText('Horas programadas', 350, $yPoint - 15) -> drawText('Horas cumplidas', 455, $yPoint - 15);

					$yPoint = $yPoint - 30;
				}
			}
			//Salto de pagina, agregar tambien || (($materia!=$reporte['materia'])&& $yPoint)?
			if ($yPoint < 90) {
				//Nueva pagina
				$page = new Zend_Pdf_Page(Zend_Pdf_Page::SIZE_A4);
				//'595:842:'
				//Agregar pagina al pdf
				$pdf -> pages[] = $page;
				$yPoint = 800;
				$currentPage++;
			}
			//Encabezado para cualquier pagina que no sea la primera
			if ($currentPage > 1 && $yPoint == 800) {

				$page -> setLineColor(new \Zend_Pdf_Color_Rgb(0, 0, 0)) -> drawLine(40, 795, ($page -> getWidth() - 40), 795) -> drawLine(40, 782, ($page -> getWidth() - 40), 782);

				$page -> setFont($font2, 10) -> drawText(strtoupper($materia), 40, 800, 'UTF-8');

				$page -> setFont($font, 10) -> drawText('Fecha', 40, 785) -> drawText('Inicio', 110, 785) -> drawText('Fin', 170, 785) -> drawText('Entrada', 230, 785) -> drawText('Salida', 290, 785)
				// -> drawText('Horas cátedra', 350, 785, 'UTF-8');
				-> drawText('Horas programadas', 350, 785) -> drawText('Horas cumplidas', 455, 785);

				$yPoint = 770;
			}
			if ($reporte['tiene'] > $reporte['hizo']) {
				$obs = true;
				$dFont = $font2;
			} else {
				$dFont = $font;
			}
			$fecha = date('d/m/Y', strtotime($reporte['fecha']));
			$page -> setFont($dFont, 10) 
			-> drawText($fecha, 40, $yPoint) 
			-> drawText($reporte['inicio'], 110, $yPoint) 
			-> drawText($reporte['fin'], 170, $yPoint) 
			-> drawText($reporte['entrada'], 230, $yPoint) 
			-> drawText($reporte['salida'], 290, $yPoint) 
			-> drawText($reporte['tiene'], 350, $yPoint) 
			-> drawText($reporte['hizo'], 455, $yPoint);

			$yPoint = $yPoint - 15;
			$totalCumplidas = $totalCumplidas + $reporte['hizo'];
			$totalProgramadas = $totalProgramadas + $reporte['tiene'];
		}

		$page -> setLineColor(new \Zend_Pdf_Color_Rgb(0, 0, 0)) 
		-> drawLine(40, $yPoint + 5, ($page -> getWidth() - 40), $yPoint + 5) 
		-> drawLine(40, $yPoint - 8, ($page -> getWidth() - 40), $yPoint - 8);

		$page -> setFont($font2, 10) -> drawText('TOTAL DE HORAS CATEDRA : ', 40, $yPoint - 5) 
		-> drawText($totalProgramadas, 350, $yPoint - 5) 
		-> drawText($totalCumplidas, 455, $yPoint - 5);

		$yPoint = $yPoint - 20;
		if ($yPoint < 90) {
			//Nueva pagina
			$page = new Zend_Pdf_Page(Zend_Pdf_Page::SIZE_A4);
			//'595:842:'
			//Agregar pagina al pdf
			$pdf -> pages[] = $page;
			$yPoint = 800;
			$currentPage++;
		}

		if ($obs) {
						$mensaje = "ATENCION: Existe una diferencia con respecto a la cantidad de horas programadas. Las razones podrían ser:";
						$mensaje_opcion01 = "- Cátedra compartida.";
						$mensaje_opcion02 = "- Asuestos/feriados.";
						//$mensaje1 = "Tenga en cuenta que proximamente se liquidará conforme el resultado de este reporte. ";
						$mensaje2 = "Si el reporte le parece incorrecto, por favor solicite un reporte de marcaciones.--";
						
			
						$page -> setFont($font2, 10) -> drawText($mensaje, 40, $yPoint - 5, 'UTF-8') 
							-> drawText($mensaje_opcion01, 40, $yPoint - 18, 'UTF-8') 
							-> drawText($mensaje_opcion02, 40, $yPoint - 28, 'UTF-8')
							//-> drawText($mensaje1, 40, $yPoint - 40, 'UTF-8') 
							-> drawText($mensaje2, 40, $yPoint - 50, 'UTF-8');
		}

		$page -> setFont($font, 10);

		//Numerar paginas
		$pageNumber = 1;
		foreach ($pdf->pages as $p) {
			$p -> drawText($pageNumber++, 550, 40);
		}

		// Guardar el pdf
		//$fileName = 'ReporteAsistencia'.$profesor.'.pdf';
		$fileName = 'ReporteAsistencia.pdf';
		$pdf -> save($fileName);

		X\Msg::Success('El reporte se ha generado con éxito.');

	}

	public function pdfAction() {

		$pdf = Zend_Pdf::load('ReporteAsistencia.pdf');

		$this -> getResponse() -> setHeader('Content-type', 'application/x-pdf', true);
		$this -> getResponse() -> setHeader('Content-disposition', "filename=ReporteAsistencia.pdf", true);
		$this -> getResponse() -> setBody($pdf -> render());
	}

	private static function imprimirCabeceraProfPdf($page, $font, $font2, $nombreProfesor, $desde, $hasta) {
		$page -> setFont($font2, 10) -> drawText('REPORTE DE ASISTENCIA DE PROFESORES', 40, 800) -> drawText('Docente', 40, 785) -> drawText('Desde', 40, 770) -> drawText('Hasta', 40, 755) -> drawText(':', 83, 785) -> drawText(':', 83, 770) -> drawText(':', 83, 755);

		$page -> setFont($font, 10) -> drawText("$nombreProfesor", 90, 785, 'UTF-8') -> drawText("$desde", 90, 770) -> drawText("$hasta", 90, 755);

		$page -> setLineColor(new \Zend_Pdf_Color_Rgb(0, 0, 0)) -> drawLine(40, 745, ($page -> getWidth() - 40), 745);

	}

	private static function imprimirCabeceraMateriaProf($page, $yPoint, $font, $reporte) {
		$materia = $reporte['materia'];
		$carreras = "";
		foreach ($reporte['carrera'] as $c) {
			$carreras .= $carreras == "" ? $c : ", " . $c;
		}
		$secciones = "";
		foreach ($reporte['seccion'] as $c) {
			$secciones .= $secciones == "" ? $c : ", " . $c;
		}

		$page -> setFont($font, 10) -> drawText(strtoupper($materia) . " - Carreras: " . strtoupper($carreras) . " - Secciones: " . $secciones, 40, $yPoint + 20, 'UTF-8');

		$page -> setLineColor(new \Zend_Pdf_Color_Rgb(0, 0, 0)) -> drawLine(40, $yPoint + 15, ($page -> getWidth() - 40), $yPoint + 15) -> drawLine(40, $yPoint + 2, ($page -> getWidth() - 40), $yPoint + 2);

		$page -> setFont($font, 10) -> drawText('Fecha', 40, $yPoint + 5) -> drawText('Inicio', 110, $yPoint + 5) -> drawText('Fin', 170, $yPoint + 5) -> drawText('Entrada', 230, $yPoint + 5) -> drawText('Salida', 290, $yPoint + 5) -> drawText('Horas programadas', 350, $yPoint + 5) -> drawText('Horas cumplidas', 455, $yPoint + 5);
	}

	private static function esNuevaCabecera($registroAnterior, $registroActual) {
		if (strcmp($registroAnterior[0], $registroActual[0]) == 0) {
			if (count($registroAnterior[1]) == count($registroActual[1])) {
				for ($i = 0; $i < count($registroAnterior[1]); $i++) {
					if (strcmp($registroAnterior[1][$i], $registroActual[1][$i]) != 0)
						return true;
				}
			} else {
				return true;
			}

			if (count($registroAnterior[2]) == count($registroActual[2])) {
				for ($i = 0; $i < count($registroAnterior[2]); $i++) {
					if (strcmp($registroAnterior[2][$i], $registroActual[2][$i]) != 0)
						return true;
				}
			} else {
				return true;
			}

			return false;
		}

		return true;
	}

	private static function imprimirPieMateriaProf($pdf, $page, $currentPage, $yPoint, $font, $font2, $totalProgramadas, $totalCumplidas) {
		$page -> setLineColor(new \Zend_Pdf_Color_Rgb(0, 0, 0)) -> drawLine(40, $yPoint - 8, ($page -> getWidth() - 40), $yPoint - 8) -> drawLine(40, $yPoint - 25, ($page -> getWidth() - 40), $yPoint - 25);
		$page -> setFont($font2, 10) -> drawText('TOTAL DE HORAS CATEDRA : ', 40, $yPoint - 20) -> drawText($totalProgramadas, 385, $yPoint - 20) -> drawText($totalCumplidas, 485, $yPoint - 20);

		$yPoint = $yPoint - 35;
		if ($yPoint < 120) {
			//Nueva pagina
			$page = new Zend_Pdf_Page(Zend_Pdf_Page::SIZE_A4);
			//'595:842:'
			//Agregar pagina al pdf
			$pdf -> pages[] = $page;
			$yPoint = 800;
			$currentPage++;
		}

		if ($totalCumplidas < $totalProgramadas) {
			//$mensaje = "ATENCIÓN: No se ha cumplido con la cantidad de horas programadas.";
			$mensaje = " ATENCION: No se ha cumplido con la cantidad de horas programadas.\n Esto podria deberse a que una cátedra es compartida o debido a asuestos/feriados. \n ";

			$page -> setFont($font2, 10) -> setFillColor(Zend_Pdf_Color_Html::color('#FF0000')) -> drawText($mensaje, 40, $yPoint - 5, 'UTF-8');

			$page -> setFont($font2, 10) -> setFillColor(Zend_Pdf_Color_Html::color('#000000'));
		}

		$page -> setFont($font, 10);
	}

	private static function ordenarRegistrosMateria($reportes) {

		for ($key = 0; $key < count($reportes); ) {
			$endLoop = false;
			$compararMateria = $reportes[$key]['materia'];
			$compararSeccion = $reportes[$key]['seccion'];
			$compararCarrera = $reportes[$key]['carrera'];

			$commonArray = array();
			$comInd = 0;
			$to = $key;

			$commonArray[$comInd++] = $reportes[$key];
			for ($i = $key + 1; $i < count($reportes) && !$endLoop; ) {
				while (is_null($reportes[$i]) && $i < count($reportes)) {
					$i++;
				}
				if ($i < count($reportes)) {
					if (strcmp($reportes[$i]['materia'], $compararMateria) == 0) {
						if (count($reportes[$i]['seccion']) == count($compararSeccion)) {
							for ($j = 0; $j < count($reportes[$i]['seccion']) && !$endLoop; $j++) {
								if (strcmp($reportes[$i]['seccion'][$j], $compararSeccion[$j]) != 0) {
									$endLoop = true;
								}

							}
						} else {
							$endLoop = true;
						}

						if (count($reportes[$i]['carrera']) == count($compararCarrera)) {
							for ($j = 0; $j < count($reportes[$i]['carrera']) && !$endLoop; $j++) {
								if (strcmp($reportes[$i]['carrera'][$j], $compararCarrera[$j]) != 0) {
									$endLoop = true;
								}

							}
						} else {
							$endLoop = true;
						}
					} else {
						$endLoop = true;
					}

					if (!$endLoop) {
						$commonArray[$comInd] = $reportes[$i];
						$to = $i;
					}
				}
			}

			foreach ($commonArray as $ind => $row) {
				$reporteFecha[$ind] = $row['fecha'];
			}

			array_multisort($reporteFecha, SORT_ASC, $commonArray);
			array_splice($reportes, $key, $to - $key + 1, $commonArray);

			$key = $to + 1;
			while (is_null($reportes[$key]) && $key < count($reportes)) {
				$key++;
			}
		}

		return $reportes;
	}

	private function getReporteAsistenciaPdf($pdf, $profesor, $reportes, $desde, $hasta) {
		$nombreProfesor = $profesor['apellido'] . ', ' . $profesor['nombre'];

		$page = new Zend_Pdf_Page(Zend_Pdf_Page::SIZE_A4);
		//Crear pagina
		//Definir fuentes
		$font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA);
		$font2 = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA_BOLD);

		ReporteController::imprimirCabeceraProfPdf($page, $font, $font2, $nombreProfesor, $desde, $hasta);

		//Agregar pagina al pdf
		$pdf -> pages[] = $page;

		$currentPage = 1;
		$yPoint = 710;
		$obs = false;
		$firstHead = true;

		$registroActual = array("", array(), array());
		$totalCumplidas = 0;
		$totalProgramadas = 0;

		//$reportes = ReporteController::ordenarRegistrosMateria($reportes);

		foreach ($reportes as $reporte) {
			$registroComparar = array($reporte['materia'], $reporte['carrera'], $reporte['seccion']);
			if (ReporteController::esNuevaCabecera($registroActual, $registroComparar)) {
				if (!$firstHead) {
					ReporteController::imprimirPieMateriaProf($pdf, $page, $currentPage, $yPoint, $font, $font2, $totalProgramadas, $totalCumplidas, $obs);
					$yPoint -= 100;
				}
				ReporteController::imprimirCabeceraMateriaProf($page, $yPoint, $font2, $reporte);
				$totalCumplidas = 0;
				$totalProgramadas = 0;
			}

			$firstHead = false;
			if ($yPoint < 200) {
				//Nueva pagina
				$page = new Zend_Pdf_Page(Zend_Pdf_Page::SIZE_A4);
				//'595:842:'
				//Agregar pagina al pdf
				$pdf -> pages[] = $page;
				$currentPage++;

				$page -> setLineColor(new \Zend_Pdf_Color_Rgb(0, 0, 0)) -> drawLine(40, 795, ($page -> getWidth() - 40), 795) -> drawLine(40, 782, ($page -> getWidth() - 40), 782);

				$page -> setFont($font, 10) -> drawText('Fecha', 40, 785) -> drawText('Inicio', 110, 785) -> drawText('Fin', 170, 785) -> drawText('Entrada', 230, 785) -> drawText('Salida', 290, 785) -> drawText('Horas programadas', 350, 785) -> drawText('Horas cumplidas', 455, 785);

				$yPoint = 770;
			} else {
				$yPoint = $yPoint - 15;
			}

			$obs = ($reporte['tiene'] > $reporte['hizo']);
			$dFont = ($reporte['tiene'] > $reporte['hizo']) ? $font2 : $font;

			$fecha = date('d/m/Y', strtotime($reporte['fecha']));
			$page -> setFont($dFont, 10) -> drawText($fecha, 40, $yPoint) -> drawText($reporte['inicio'], 110, $yPoint) -> drawText($reporte['fin'], 170, $yPoint) -> drawText($reporte['entrada'], 230, $yPoint) -> drawText($reporte['salida'], 290, $yPoint) -> drawText($reporte['tiene'], 385, $yPoint) -> drawText($reporte['hizo'], 485, $yPoint);

			$totalCumplidas = $totalCumplidas + $reporte['hizo'];
			$totalProgramadas = $totalProgramadas + $reporte['tiene'];

			$registroActual = array($reporte['materia'], $reporte['carrera'], $reporte['seccion']);
		}
		ReporteController::imprimirPieMateriaProf($pdf, $page, $currentPage, $yPoint, $font, $font2, $totalProgramadas, $totalCumplidas);
	}

	private function getDatosProfesores() {
		return $this -> em -> createQueryBuilder() -> select('u.idUsuario') -> addselect('p.codigoTarjeta') -> addselect('u.nombre') -> addselect('u.apellido') -> from('Default_Model_Profesor', 'p') -> join('p.usuario', 'u') -> getQuery() -> execute();
	}

	private function getCursosValidosProfPeriodo($codigo, $desde, $hasta, $cotaDesde, $cotaHasta) {
		$cursos = $this -> em -> createQueryBuilder() -> select('c.idCurso') -> addSelect('c.validoDesde') -> addSelect('c.validoHasta') -> addSelect('c.seccion') -> addSelect('p.idProfesor') -> addSelect('d.dia') -> addSelect('d.horaInicio') -> addSelect('d.horaFin') -> addSelect('d.duracionHoras') -> addSelect('m.idMateria') -> addSelect('m.nombre') -> addSelect('ca.duracionHora') -> addSelect('ca.nombre as carrera') -> addSelect('cm.semestre') -> from('Default_Model_Curso', 'c') -> join('c.carreraMateria', 'cm') -> join('c.responsables', 'r') -> join('c.detalles', 'd') -> join('r.profesor', 'p') -> join('cm.materia', 'm') -> join('cm.carrera', 'ca') -> andWhere("p.codigoTarjeta='" . $codigo . "'") -> andWhere('r.marca= true') -> andWhere("c.validoDesde<='" . $desde . "' AND c.validoHasta>='" . $desde . "' OR
                                       c.validoDesde<='" . $hasta . "' AND c.validoHasta>='" . $hasta . "'") -> orderBy('m.nombre', 'asc') -> orderBy('c.seccion', 'asc') -> orderBy('c.validoDesde', 'asc') -> orderBy('d.dia', 'asc') -> getQuery() -> execute();

		foreach ($cursos as &$curso) {
			if ($curso['validoDesde'] -> format('Y-m-d') < $cotaDesde) {
				$curso['validoDesde'] = $cotaDesde;
			} else {
				$curso['validoDesde'] = $curso['validoDesde'] -> format('Y-m-d');
			}
			if ($curso['validoHasta'] -> format('Y-m-d') > $cotaHasta) {
				$curso['validoHasta'] = $cotaHasta;
			} else {
				$curso['validoHasta'] = $curso['validoHasta'] -> format('Y-m-d');
			}
			$curso['horaInicio'] = $curso['horaInicio'] -> format('H:i:s');
			$curso['horaFin'] = $curso['horaFin'] -> format('H:i:s');
		}

		return $cursos;
	}

	private function getMarcacionesProfesorPeriodo($codigo, $desde, $hasta) {
		$marcaciones = $this -> em -> createQueryBuilder() -> select('h.fecha') -> addSelect('h.tipo') -> addSelect('h.entrada_salida') -> from('Default_Model_HorarioDia', 'h') -> where("h.id_empleado='" . $codigo . "'") -> andWhere($this -> em -> createQueryBuilder() -> expr() -> between('h.fecha', "'" . $desde . "'", "'" . $hasta . "'")) -> getQuery() -> execute();

		$data = array('fecha' => '', 'dia' => '', 'entrada' => '', 'salida' => '');

		$dataSet = array();
		// registros finales
		list($date, $month, $year) = explode("/", $desde);
		$fechaAux = $year . "-" . $month . "-" . $date;
		$fechaActual = date('Y-m-d', strtotime($fechaAux) - 86400);
		$marcaEntrada = false;
		$marcaSalida = false;

		foreach ($marcaciones as $marca) {
			//Marcacion en un mismo dia, luego de marcar salida
			if ($marca['fecha'] == $fechaActual) {
				if ($marcaSalida) {
					//Si es salida, se actualiza la hora de salida
					if ($marca['tipo'] == 'SALIDA') {
						$data['salida'] = $marca['entrada_salida'] -> format('H:i:s');
					} else {//Si es entrada, se agrega la marcacion anterior y se inicializa una nueva
						array_push($dataSet, $data);
						$marcaSalida = false;
						unset($data);
						$data = array('fecha' => '', 'dia' => '', 'entrada' => '', 'salida' => '');
						$data['fecha'] = $fechaActual -> format('Y-m-d');
						$data['dia'] = date('N', strtotime($marca['fecha']));
						$data['entrada'] = $marca['entrada_salida'] -> format('H:i:s');
						$marcaEntrada = true;
					}
				} elseif ($marca['tipo'] == 'ENTRADA' && !$marcaEntrada) {
					$marcaSalida = false;
					unset($data);
					$data = array('fecha' => '', 'dia' => '', 'entrada' => '', 'salida' => '');
					$data['fecha'] = $fechaActual -> format('Y-m-d');
					$data['dia'] = date('N', strtotime($marca['fecha']));
					$data['entrada'] = $marca['entrada_salida'] -> format('H:i:s');
					$marcaEntrada = true;
				}

			}
			//Nuevo dia
			if ($marca['fecha'] != $fechaActual) {
				//La salida del dia anterior fue la ultima, se agrega la marcacion
				if ($marcaEntrada && $marcaSalida) {
					array_push($dataSet, $data);
					$marcaSalida = false;
				}
				$marcaEntrada = false;
				$fechaActual = $marca['fecha'];
				if ($marca['tipo'] == 'ENTRADA') {
					unset($data);
					$data = array('fecha' => '', 'dia' => '', 'entrada' => '', 'salida' => '');
					$data['fecha'] = $fechaActual -> format('Y-m-d');
					$data['dia'] = date('N', strtotime($marca['fecha']));
					$data['entrada'] = $marca['entrada_salida'] -> format('H:i:s');
					$marcaEntrada = true;
				}
			}
			//Marcacion de salida, puede no ser la ultima
			if ($marca['fecha'] == $fechaActual && $marca['tipo'] == 'SALIDA' && $marcaEntrada) {
				$data['salida'] = $marca['entrada_salida'] -> format('H:i:s');
				$marcaSalida = true;
			}
		}
		//Se agrega la ultima marcacion correcta
		if ($marcaEntrada && $marcaSalida) {
			array_push($dataSet, $data);
		}

		return $dataSet;
	}

	private function getSuspensionesClases($desde, $hasta) {
		$qb = $this -> em -> createQueryBuilder();

		//Se traen los detalles del calendario del corriente año
		$detallesCalendario = $qb -> select('dc.fechaInicio') -> addSelect('dc.fechaFin') -> addSelect('dc.horaInicio') -> addSelect('dc.horaFin') -> addSelect('dc.semestres') -> addSelect('dc.carrera') -> from('Default_Model_Calendario', 'dc') -> where($qb -> expr() -> between('dc.fechaInicio', "'" . $desde . "'", "'" . $hasta . "'")) -> orderBy('dc.fechaInicio', 'asc') -> getQuery() -> execute();

		$eventSet = array();
		if (count($detallesCalendario) > 0) {
			foreach ($detallesCalendario as $d) {
				//definir semestre afectados por evento
				$sems = array();
				$aux = $d['semestres'];

				$candidate = "";
				$length = strlen($aux);
				$isRange = false;
				$from = "";
				$to = "";

				/* se obtiene la lista de semestres en los que es válida la suspensión actualmente analizada */
				for ($i = 0; $i < $length; $i++) {
					// semestre válido
					if (ctype_digit($aux[$i])) {
						$candidate .= $aux[$i];
					}
					// rango de semestres: semestre inicial en $candidate
					if ($aux[$i] == '-') {
						$isRange = true;
						$from = intval($candidate);
						unset($candidate);
					}
					// finaliza el patrón de semestres actual: patrones separados entre comas
					if ($aux[$i] == ',' || $i + 1 == $length) {
						if ($isRange) {
							// ultimo semestre del rango
							$to = intval($candidate);
							for ($j = $from; $j <= $to; $j++) {
								array_push($sems, $j);
							}
							unset($from);
							unset($to);
							$isRange = false;
						} else {
							array_push($sems, intval($candidate));
						}
						unset($candidate);
					}
				}

				// cada día de suspensión en un array de eventos
				//Transformar rango de fechas en dias y cargar demas datos de eventos
				$inicio = $d['fechaInicio'] -> format('Y-m-d');
				$hasta = $d['fechaFin'] -> format('Y-m-d');
				while ($inicio <= $hasta) {
					$event = array('fecha' => $inicio, 'inicio' => $d['horaInicio'] -> format('H:i'), 'fin' => $d['horaFin'] -> format('H:i'), 'semestres' => $sems, 'carrera' => $d['carrera']);
					array_push($eventSet, $event);
					unset($event);
					$inicio = date("Y-m-d", strtotime("+1 day", strtotime($inicio)));
				}
			}
		}
		return $eventSet;
	}

	private function verificarAsistenciaProfCurso($cotaDesde, $cotaHasta, $curso, $dataSet, $reportes, $detallesCalendario) {
		$fechaActual = $cotaDesde;
		$marcacion = reset($dataSet);

		while ($fechaActual <= $cotaHasta) {
			if ($fechaActual >= $curso['validoDesde'] && $fechaActual <= $curso['validoHasta']) {
				$dia = date('N', strtotime($fechaActual));
				$debeMarcar = false;
				if ($dia == $curso['dia']) {
					$debeMarcar = true;
					$asistio = false;

					$registro = array();
					if ($fechaActual == $marcacion['fecha']) {
						// (+/-) 10 minutes, para indicar los minutos de tolerancia
						$inicioTolerable = date("H:i:s", strtotime("+10 minutes", strtotime($curso['horaInicio'])));
						$finTolerable = date("H:i:s", strtotime("-10 minutes", strtotime($curso['horaFin'])));
						while ($fechaActual == $marcacion['fecha']) {
							if (!$asistio) {
								if ($inicioTolerable >= $marcacion['entrada'] && $finTolerable <= $marcacion['salida']) {
									$registro['materia'] = $curso['nombre'];
									$registro['carrera'] = $curso['carrera'];
									$registro['seccion'] = $curso['seccion'];
									$registro['fecha'] = $fechaActual;
									$registro['inicio'] = $curso['horaInicio'];
									$registro['fin'] = $curso['horaFin'];
									$registro['entrada'] = $curso['horaInicio'];
									$registro['salida'] = $curso['horaFin'];
									$registro['tiene'] = $curso['duracionHoras'];
									$registro['hizo'] = $curso['duracionHoras'];
									$pushRegister = true;
									$asistio = true;
								} else {
									$horaEntrada = date("H:i:s", strtotime("00:00:00"));
									$horaSalida = date("H:i:s", strtotime("00:00:00"));
									$entradaValida = false;
									$salidaValida = false;
									if ($marcacion['entrada'] >= $curso['horaInicio'] && $marcacion['entrada'] < $curso['horaFin']) {
										$horaEntrada = $marcacion['entrada'];
										$entradaValida = true;
									} elseif (($marcacion['entrada'] <= $curso['horaInicio']) && ($marcacion['salida'] > $curso['horaInicio'])) {
										$horaEntrada = $curso['horaInicio'];
										$entradaValida = true;
									}

									if ($marcacion['salida'] > $curso['horaInicio'] && $marcacion['salida'] <= $curso['horaFin']) {
										$horaSalida = $marcacion['salida'];
										$salidaValida = true;
									} elseif (($marcacion['salida'] >= $curso['horaFin']) && ($marcacion['entrada'] < $curso['horaFin'])) {
										$horaSalida = $curso['horaFin'];
										$salidaValida = true;
									}

									if ($entradaValida && $salidaValida) {
										$horas = round((((strtotime($horaSalida) - strtotime($horaEntrada)) / 60) / $curso['duracionHora']) * 10) / 10;
										$registro['materia'] = $curso['nombre'];
										$registro['carrera'] = $curso['carrera'];
										$registro['seccion'] = $curso['seccion'];
										$registro['fecha'] = $fechaActual;
										$registro['inicio'] = $curso['horaInicio'];
										$registro['fin'] = $curso['horaFin'];
										$registro['entrada'] = $horaEntrada;
										$registro['salida'] = $horaSalida;
										$registro['tiene'] = $curso['duracionHoras'];
										$registro['hizo'] = $horas;
										$pushRegister = true;
										$asistio = true;
									}
								}
							}
							$marcacion = next($dataSet);
						}
						$marcacion = prev($dataSet);
						if (!$asistio) {
							$registro['materia'] = $curso['nombre'];
							$registro['carrera'] = $curso['carrera'];
							$registro['seccion'] = $curso['seccion'];
							$registro['fecha'] = $fechaActual;
							$registro['inicio'] = $curso['horaInicio'];
							$registro['fin'] = $curso['horaFin'];
							$registro['entrada'] = $horaEntrada;
							$registro['salida'] = $horaSalida;
							$registro['tiene'] = $curso['duracionHoras'];
							$registro['hizo'] = 0;
							$pushRegister = true;
						}
					}
					if ($debeMarcar && !$asistio) {
						// verificamos antes si ese día hubo suspensión de clase
						if (count($detallesCalendario) > 0) {
							foreach ($detallesCalendario as $e) {
								$fechaEvento = $e['fecha'];
								list($date, $month, $year) = explode("/", $fechaEvento);
								$fechaEvento = $year . "-" . $month . "-" . $date;

								// el día de la suspensión es un día en que se debía dar una clase.
								$dia = date('N', strtotime($fechaEvento));
								if ($dia == $curso['dia']) {
									// la carrera del curso está incluida en la suspensión?
									if ($e['carrera'] == 0 || $e['carrera'] == $curso['carrera']) {
										// el semetre del curso está incluido en la suspensión?
										if (in_array($curso['semestre'], $e['semestres'])) {
											$registro['materia'] = $curso['nombre'];
											$registro['carrera'] = $curso['carrera'];
											$registro['seccion'] = $curso['seccion'];
											$registro['fecha'] = $fechaActual;
											$registro['inicio'] = $curso['horaInicio'];
											$registro['fin'] = $curso['horaFin'];
											$registro['entrada'] = $curso['horaInicio'];
											$registro['salida'] = $curso['horaFin'];
											$registro['tiene'] = $curso['duracionHoras'];
											$registro['hizo'] = $curso['duracionHoras'];
										}
									}
								}
							}
						} else {
							$registro['materia'] = $curso['nombre'];
							$registro['carrera'] = $curso['carrera'];
							$registro['seccion'] = $curso['seccion'];
							$registro['fecha'] = $fechaActual;
							$registro['inicio'] = $curso['horaInicio'];
							$registro['fin'] = $curso['horaFin'];
							$registro['entrada'] = "00:00:00";
							$registro['salida'] = "00:00:00";
							$registro['tiene'] = $curso['duracionHoras'];
							$registro['hizo'] = 0;
						}

						$pushRegister = true;
					}
					if ($pushRegister) {
						array_push($reportes, $registro);
					}
					unset($registro);
				}
			}

			$fechaActual = date("Y-m-d", strtotime("+1 day", strtotime($fechaActual)));
			if ($fechaActual > $marcacion['fecha']) {
				$marcacion = next($dataSet);
				$fechaAyer = date("Y-m-d", strtotime("-1 day", strtotime($fechaActual)));
				if ($fechaAyer == $marcacion['fecha']) {
					$fechaActual = $fechaAyer;
				}
			}
		}

		return $reportes;
	}

	private function limpiarReportes($reportes) {
		//Ordenar $reportes por materia y fecha
		foreach ($reportes as $key => $row) {
			// por mas de que haya un registro por materia y sección, puede ser un
			// registro compartido entre varias carreras y secciones. Por ello, se comparará:
			// si la fecha y horas (inicio y fin) para una misma materia son iguales en varios
			// registros, significa que es una materia compartida
			$reporteMateria[$key] = $row['materia'];
			$reporteFecha[$key] = $row['fecha'];
			$reporteInicio[$key] = $row['inicio'];
			$reporteFin[$key] = $row['fin'];
		}
		array_multisort($reporteMateria, SORT_ASC, $reporteInicio, SORT_ASC, $reporteFin, SORT_ASC, $reporteFecha, SORT_ASC, $reportes);

		// para una misma materia, misma fecha y hora, agrupamos las carreras y secciones
		for ($repCount = 0; $repCount < count($reportes); ) {
			$lastMat = $reportes[$repCount]['materia'];
			$lastFecha = $reportes[$repCount]['fecha'];
			$lastIni = $reportes[$repCount]['inicio'];
			$lastFin = $reportes[$repCount]['fin'];

			$carreras = array();
			// carreras en comun
			$secciones = array();
			// secciones en comun
			$fromRep = $repCount;
			// en que registro inician los compartidos
			$toRep = $repCount;
			// en que registro terminan los compartidos
			while (strcmp($reportes[$repCount]['materia'], $lastMat) == 0 && strcmp($reportes[$repCount]['fecha'], $lastFecha) == 0 && strcmp($reportes[$repCount]['inicio'], $lastIni) == 0 && strcmp($reportes[$repCount]['fin'], $lastFin) == 0) {

				$carreras[] = $reportes[$repCount]['carrera'];
				$secciones[] = $reportes[$repCount]['seccion'];
				$toRep = $repCount;
				$repCount++;
			}

			$carreras = array_map("unserialize", array_unique(array_map("serialize", $carreras)));
			$secciones = array_map("unserialize", array_unique(array_map("serialize", $secciones)));
			// agrupación de materias y secciones
			for ($comCount = $fromRep; $comCount <= $toRep; $comCount++) {
				$reportes[$comCount]['carrera'] = $carreras;
				$reportes[$comCount]['seccion'] = $secciones;
			}
		}

		//Eliminar registros repetidos. Se da para el caso de catedras compartidas
		return array_map("unserialize", array_unique(array_map("serialize", $reportes)));
	}

	/*******************************************
	 * leer los registros de asistencia generados
	 *******************************************/
	private function leerRegistrosGenerados($desde, $hasta) {
		// todos los registros en el periodo especificado, aún los conflictivos
		$qb = $this -> em -> createQueryBuilder();

		$registros = $qb -> select('r') -> from('Default_Model_Registro', 'r') -> where($qb -> expr() -> between('r.fecha', "'" . $desde . "'", "'" . $hasta . "'")) -> orderBy("r.responsable") -> getQuery() -> execute();
	}

	/**********************************************************************
	 * generar datos de reporte a partir de marcaciones y datos de horarios
	 **********************************************************************/
	public function generarRegistrosConConflictos($desde, $hasta) {
		$infoProfesor = $this -> getDatosProfesores();
		$pdf = new Zend_Pdf();

		if (count($infoProfesor) > 0) {
			list($date, $month, $year) = explode("/", $desde);
			$cotaDesde = $year . "-" . $month . "-" . $date;
			list($date, $month, $year) = explode("/", $hasta);
			$cotaHasta = $year . "-" . $month . "-" . $date;

			$detallesCalendario = $this -> getSuspensionesClases($desde, $hasta);
			// suspensiones de clase
			foreach ($infoProfesor as $profesor) {
				//Traer cursos validos del profesor, durante el periodo especificado
				$cursos = $this -> getCursosValidosProfPeriodo($profesor['codigoTarjeta'], $desde, $hasta, $cotaDesde, $cotaHasta);

				// si el profesor no tiene cursos activos no se considera
				if (count($cursos) > 0) {
					$dataSet = $this -> getMarcacionesProfesorPeriodo($profesor['codigoTarjeta'], $desde, $hasta);

					$reportes = array();
					foreach ($cursos as $curso) {
						$reportes = $this -> verificarAsistenciaProfCurso($cotaDesde, $cotaHasta, $curso, $dataSet, $reportes, $detallesCalendario);
					}

					// ordena y quita registros repetidos, agrupando las materias compartidas entre carreras y secciones
					$reportes = $this -> limpiarReportes($reportes);

					$this -> getReporteAsistenciaPdf($pdf, $profesor, $reportes, $desde, $hasta);
				}
			}
		}

		//Numerar paginas
		$pageNumber = 1;
		foreach ($pdf->pages as $p) {
			$p -> drawText($pageNumber++, 550, 40);
		}

		// Guardar el pdf
		$fileName = 'asistenciaConConflictos/' . date("ymdHi") . '.pdf';
		$pdf -> save($fileName);

		header('Content-Type:', 'application/pdf');
		header('Content-Disposition:', 'inline;');

		// Output pdf
		echo $pdf -> render();
	}

	public function reporteControlConConflictosAction() {
		X\Permiso::paraAction('Generar.Reporte');

		// date of last generation
		$lastGen = $this -> em -> createQueryBuilder() -> select('c.valor') -> where("c.nombre='fin_registro'") -> from('Default_Model_Configuracion', 'c') -> getQuery() -> execute();
		$lastGen = $lastGen[0]['valor'];

		// rango de fechas para generar registros
		/* $desde = $this->_request->getPost('desde');
		 $hasta = $this->_request->getPost('hasta');
		 */
		$desde = "01/10/2013";
		$hasta = "24/10/2013";

		// tenemos los registros generados hasta la fecha
		if ($hasta < $lastGen) {
			$this -> leerRegistrosGenerados($desde, $hasta);
			// si no tenemos los registros, procedemos a generarlos (no se guarda en BD).
		} else {
			$this -> generarRegistrosConConflictos($desde, $hasta);
		}
	}

}
